<?php
/**
 * @author iceboy
 * @date 2009-08-22
 * @todo 分页功能模块
 * 	@param 参数的设置可以在初始化的时候就以数组的形式设置
 * 			同时也支持用set_attribute方法来设置。
 * 
 * @date 2009-09-24
 * @todo 添加直接跳转到某一页的功能
 * 
 * @example 
 * $config=array(
				'page_goto'=>'last',
				'view_prod_num'=>$this->list_teiba_num,
				'now_page'=>$page+1,
				'prod_num'=>$num,
				'url_array'=>$page_url,
				'page_list_div'=>array('class'=>'pagelist'),
				'class'=>array(
			        #当前页的样式
			    	 'thispage'=>'grey',
			        #非当前页的样式
			        'otherpage'=>'',
			        #没有链接的页面样式
			        'nourl'=>'',
			        #鼠标移动到上面的样式
			        'mouseover'=>'',
			        #直接跳转部份span的样式
			        'goto'=>'nonstop',
			        #直接跳转部份文本框样式
			        'goto_text'=>'goto_text',
			        #直接跳转部份按钮样式
			        'goto_button'=>'bt'
			    )
			);
			$page=new page($config);
			$page_html=$page->get_page();
 *
 */

class page{
	#goto部份放在前面还是后面，frist是前，last是后，空则不输入goto部份
	private $page_goto='';
	#共有多少个物品需要做分页
	private $prod_num=0;
    #每页显示的page的数量
    private $view_prod_num=10;
    #每页显示的页码个数
    private $view_num=10;
    #当前第几页,此当前页会比显示出来的页数要少1
    private $now_page=1;
    #共有多少页
    private $total_page=50;
    #当前页前固定显示多少个页码
    private $first_num=3;
    #取链接的数组,目前只支持一次性赋值
    private $url_array='';
    #分页样式表
    private $class=array(
        #当前页的样式
    	 'thispage'=>'thispage',
        #非当前页的样式
        'otherpage'=>'otherpage',
        #没有链接的页面样式
        'nourl'=>'nourl',
        #鼠标移动到上面的样式
        'mouseover'=>'mouseover',
        #直接跳转部份span的样式
        'goto'=>'nonstop',
        #直接跳转部份文本框样式
        'goto_text'=>'goto_text',
        #直接跳转部份按钮样式
        'goto_button'=>'goto_button'
    );
    #分页列表存放的DIV的参数
    private $page_list_div=array(
        'id'=>'all',
        'name'=>'',
        'class'=>''
    );
    #分页列表中的上页下页提示的文字
    private $page_list_note=array(
        'priv'=>'prev',
        'next'=>'next',
        'first'=>'first',
        'last'=>'last',
        'gototext'=>'goto',
        'gotobutton'=>'go'
    );
    
    function __construct(array $attribute=null){
        if(!is_null($attribute)){
            foreach ($attribute as $key=>$value){
                $this->set_attribute($key,$value);
            }
        }
    }
    /**
     * @param $var 分页属性的属性名
     * @param $value 分页属性的值
     * @return unknown_type 无返回值
     */
    function set_attribute($var,$value){
        if(isset($this->$var)){
            if(is_array($this->$var)){
            	#exit(var_dump($value));
                #如果是数组，则一个一个进行赋值
                foreach($this->$var as $k=>&$v){
                	#exit(var_dump($this->$var));
                    $v=$value[$k];
                   }
            }else{
                #如果不是数组，则单一进行赋值
                $this->$var=$value;
            }
        }
     }
     
    function get_page(){
        if($this->now_page<1 || $this->now_page>$this->total_page){
            return '您所设的当前页不正确！';
        }
        $this->total_page=(int)ceil($this->prod_num/$this->view_prod_num);
        $return='<div class="'.$this->page_list_div['class'].'" id="'.$this->page_list_div['id'].'" name="'.$this->page_list_div['name'].'">';
        if ($this->page_goto==='frist') {
        	$return.=$this->goto_page();
        }
        $return.=$this->create_page_list();
        if ($this->page_goto==='last') {
        	$return.=$this->goto_page();
        }
        $return.='</div>';
        return $return;
    }
    /**
     * @author iceboy
     * @date 2009-08-22
     * @todo 生成分页菜单的HTML部份
     * @return 生成好的列表部份的分页菜单
     */
    private function create_page_list(){
        $return='';
        ##第一页的显示判断
        if($this->now_page===1){
            $return.=<<<ICEBOY
                <span class="{$this->class['nourl']}">{$this->page_list_note['first']}</span>
                <span class="{$this->class['thispage']}">1</span>
ICEBOY;
        }else{
            $return.=<<<ICEBOY
                <span class="{$this->class['otherpage']}"><a href="{$this->get_url($this->now_page-1)}">{$this->page_list_note['priv']}</a></span>
                <span class="{$this->class['otherpage']}"><a href="{$this->get_url(1)}">1</a></span>
ICEBOY;
        }
        #判断是否需要出现第一页后面的省略号
        if($this->now_page>$this->first_num+2){
            $return.="<span class='{$this->class['nourl']}'>...</span>";
        }else{
            #设置终止页，如果从头开始显示页码的话，就显示设定的每次显示的页码个数
            $for_unit=$this->view_num>$this->total_page ? $this->total_page : $this->view_num;
        }
        #循环显示中间列表部份的数字
        #设置的起始页
        $for_start=$this->now_page-$this->first_num>1 ? $this->now_page-$this->first_num : 2;
        #设置的终止页
        if(empty($for_unit)){
            $for_unit=$this->now_page+($this->view_num-$this->first_num-1) > $this->total_page ? $this->total_page : $this->now_page+($this->view_num-$this->first_num-1);
        }
        #exit((string)$for_unit);
        for ($i=$for_start;$i<=$for_unit;$i++){
        	$page_url=$this->get_url($i);
            $class=$this->now_page===$i ? $this->class['thispage'] : $this->class['otherpage'];
            $return.="<span class='$class'><a href='$page_url'>$i</a></span>";
         }
         #判断是否需要出现最后一页前面的省略号
         if($for_unit<$this->total_page-1){
             $return.="<span class='{$this->class['nourl']}'>...</span>";
         }
         #判断是否需要出现最后一个页码
         if($for_unit!==$this->total_page){
             $return.="<span class='{$this->class['otherpage']}'><a href='{$this->get_url($this->total_page)}'>{$this->total_page}</a></span>";
             $return.="<span class='{$this->class['otherpage']}'><a href='{$this->get_url($this->now_page+1)}'>{$this->page_list_note['next']}</a></span>";
         }elseif($this->now_page<$this->total_page){
         	#exit(var_dump($for_unit));
             $return.="<span class='{$this->class['otherpage']}'><a href='{$this->get_url($this->now_page+1)}'>{$this->page_list_note['next']}</a></span>";
         }else{
         	$return.="<span class='{$this->class['nourl']}'>{$this->page_list_note['next']}</span>";
         }
        /**
         * 设置分页的部加JS，需要加载的样式
         */
        $return.=<<<ICEBOY
        	<script>
    			if (typeof(window.jQuery)=="undefined"){
    				alert('由于没有正确加载Jquery库，分页有一些效果将无法实现');
    			}else{
            		$().ready(function(){
                    	$('.{$this->class['otherpage']}').bind('mouseover',function(){
                    		page_span_on_mouse_over(this);
                    	});
                    	$('.{$this->class['otherpage']}').bind('mouseout',function(){
                    		page_span_on_mouse_out(this);
                    	});
                    });
                    function page_span_on_mouse_over(e){
                    	$(e).addClass('{$this->class['mouseover']}');
                    }
                    function page_span_on_mouse_out(e){
                    	$(e).removeClass('{$this->class['mouseover']}');
                    }
                }
        	</script>
ICEBOY;
        return $return;
    }
    /**
     * @author shnejun
     * @date 2009-09-24
     * @todo 添加直接跳转到某一页的功能
     * @return unknown
     */
    function goto_page(){
    	$url=$this->get_url();
    	$return=<<<SHENJUN
    	<span class="{$this->class['goto']}">
    	<form method="post" action="$url" id="ice_page_form" style="display: inline;">
    		{$this->page_list_note['gototext']}
    		<input type="text" value="" class="{$this->class['goto_text']}"  size="4" id="ice_page_num" name="ice_page_num">
    		<input type="hidden" value="" name="page" id="ice_real_num"/>
    		<span class="{$this->class['goto_button']}" onclick="check_ice_goto_page()">{$this->page_list_note['gotobutton']}</span>
    	</form>
    	</span>
    	<script>
    	var real_total_page={$this->total_page};
    	function check_ice_goto_page(){
    		var input_page=$('#ice_page_num').val();
    		if(isNaN(input_page) || input_page=='' || parseInt(input_page)==0){
    			alert('请输入正确的页码！')
    			return false;
    		}
    		input_page=parseInt(input_page);
    		if(input_page>real_total_page){
    			alert('输入的页码不能大于最大的页码！')
    			return false;
    		}
    		$('#ice_real_num').val(input_page-1);
    		$('#ice_page_form').submit();
    	}
    	</script>
SHENJUN;
		return $return;
    }
    
    function get_url($page=''){
    	$url_array=$this->url_array;
    	if (!empty($page)) {
    		$url_array['page']=$page-1;
    	}
    	$url=$this->url_array;
    	//$m=array_shift($url_array);
    	//$a=array_shift($url_array);
    	
   		//array_unshift($url_array,$a);
   		//array_udiff($url_array,$a);
   		//var_dump($url_array);
    	return get_url($url_array);
    }
}
?>